﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Globalization;
using Persistence = Entersoft.Data.DotNetDAL.SQL.Persistence;

namespace BLL
{
    public class Periodos : Common
    {
        [EditorBrowsable(EditorBrowsableState.Never)]
        //private IList<Periodo> mLista;
 
        public static bool EliminaPeriodo(string Periodo, ref string Mensaje)
        {
            bool retorno;

            var objRP = new Entersoft.Data.DotNetResponse.SQL.Persistence {StoredProcedure = "sp_del_PeriodoCascada"};

            objRP.AddParametro(Periodo);
            objRP.AddParametro(-99);
            objRP.AddParametro("");

            using (var objConn = new Persistence(true, ConnDB))
            {
                objConn.ExecuteNonQuery(ref objRP);

                retorno = objRP.Parametro[1].ToString().Equals("0");
                Mensaje = objRP.Parametro[2].ToString();

                if (retorno)
                    objConn.Commit();
            }

            objRP.Dispose();

            return retorno;
        }

        public static IList<Periodo> ObtenerPeriodos(ref string message)
        {
            return ObtenerPeriodos(null, ref message);
        }

        public static IList<Periodo> ObtenerPeriodos(int? Periodo, ref string message)
        {
            var rp = new Entersoft.Data.DotNetResponse.SQL.Persistence {StoredProcedure = "sp_get_Periodos"};
            var retorno = new List<Periodo>();

            using (var objConn = new Persistence(false, ConnDB))
            {
                rp.AddParametro(Periodo);

                objConn.ExecuteDataTable(ref rp);

                if (!rp.TieneErrores)
                {
                    if (rp.DataTable != null)
                        foreach (DataRow row in rp.DataTable.Rows)
                            retorno.Add(new Periodo(row["Llave"].ToString(), row["Glosa"].ToString(),
                                                    row["FechaCargaSAP"].ToString(), Convert.ToInt16(row["EstadoId"])));
                }
                else
                    message = rp.Errores;
            }

            rp.Dispose();
            
            return retorno;
        }

        public static int ObtenerEstadoByPeriodo(string Periodo)
        {
            var retorno = -999;

            var objRP = new Entersoft.Data.DotNetResponse.SQL.Persistence();

            using (var objConn = new Persistence(false, ConnDB))
            {
                objConn.ExecuteScalar(ref objRP, string.Format("SELECT dbo.fn_EstadoByPeriodo('{0}')", Periodo));

                if (!objRP.TieneErrores)
                    if (objRP.GetScalar != null)
                        retorno = Convert.ToInt16(objRP.GetScalar);
            }

            objRP.Dispose();

            return retorno;
        }

        public static bool ExistenPeriodosEnToma(ref string Mensaje)
        {
            bool retorno;

            var rp = new Entersoft.Data.DotNetResponse.SQL.Persistence();

            using (var objConn = new Persistence(false, ConnDB))
            {
                rp.ClearParametro();

                objConn.ExecuteScalar(ref rp, string.Format("SELECT dbo.fn_ExistenPeriodoEnToma() "));

                retorno = rp.Parametro[2].ToString().Equals("0");
                Mensaje = rp.Parametro[3].ToString();

                if (retorno)
                    objConn.Commit();
            }

            rp.Dispose();

            return retorno;
        }

        public static bool ActualizarGlosaPeriodo(string Periodo, string Glosa, ref string Mensaje)
        {
            bool retorno;

            var rp = new Entersoft.Data.DotNetResponse.SQL.Persistence { StoredProcedure = "sp_upd_GlosaPeriodo" };

            using (var objConn = new Persistence(true, ConnDB))
            {
                rp.ClearParametro();

                rp.AddParametro(Periodo);
                rp.AddParametro(Glosa);
                rp.AddParametro(-99);
                rp.AddParametro("");

                objConn.ExecuteNonQuery(ref rp);

                retorno = rp.Parametro[2].ToString().Equals("0");
                Mensaje = rp.Parametro[3].ToString();

                if (retorno)
                    objConn.Commit();
            }

            rp.Dispose();

            return retorno;
        }
    }

    [Serializable]
    public class Periodo: Common
    {
        [EditorBrowsable(EditorBrowsableState.Never)] private string mLlave;
        [EditorBrowsable(EditorBrowsableState.Never)] private string mGlosa;
        [EditorBrowsable(EditorBrowsableState.Never)] private string mFechaCargaSAP;
        [EditorBrowsable(EditorBrowsableState.Never)] private Estado mEstado;

        public Periodo()
            : this(
                string.Format("{0}{1}{2}", DateTime.Now.Year,
                                              DateTime.Now.Month.ToString().PadLeft(2, Convert.ToChar("0")),
                                              DateTime.Now.Day),
                string.Format("{0} {1}", GetMonthName(DateTime.Now).ToUpper(), DateTime.Now.Year))
        {
        }

        public Periodo(string Llave)
        {
            mMensaje = "";

            var tmpPeriodos = Periodos.ObtenerPeriodos(ref mMensaje);

            foreach (var tmpPeriodo in tmpPeriodos)
            {
                if (!tmpPeriodo.Llave.Equals(Llave)) continue;

                mLlave = Llave;
                mGlosa = tmpPeriodo.Glosa;
                mEstado = tmpPeriodo.Estado;
                mFechaCargaSAP = tmpPeriodo.mFechaCargaSAP;

                break;
            }
        }

        public Periodo(string Llave, string Glosa): this(Llave, Glosa, null)
        {
        }

        public Periodo(string Llave, string Glosa, string FechaCargaSAP): this(Llave, Glosa, FechaCargaSAP, -99)
        {
        }

        public Periodo(string Llave, string Glosa, string FechaCargaSAP, int EstadoId)
        {
            mLlave = Llave;
            mGlosa = Glosa;
            mFechaCargaSAP = FechaCargaSAP;

            mEstado = Estados.ObtenerEstadoPeriodoById(EstadoId);
        }

        public string Llave
        {
            get { return mLlave; }
            set { mLlave = value; }
        }

        public string Glosa
        {
            get { return mGlosa; }
            set { mGlosa = value; }
        }

        public string FechaCargaSAP
        {
            get { return mFechaCargaSAP; }
            set { mFechaCargaSAP = value; }
        }

        public Estado Estado
        {
            get
            {
                mEstado = Estados.ObtenerEstadoPeriodoById(Periodos.ObtenerEstadoByPeriodo(mLlave));
                
                return mEstado;
            }
            set { mEstado = value; }
        }

        private static string GetMonthName(DateTime dateTime)
        {
            return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(dateTime.Month);
        }
        
        public bool Grabar()
        {
            return Grabar(mLlave, mGlosa, mEstado);
        }

        public bool Grabar(string Llave, string Glosa, Estado Estado)
        {
            return Grabar(Llave, Glosa, Estado, ref mMensaje);
        }

        public static bool Grabar(string Llave, string Glosa, Estado Estado, ref string message)
        {
            var retorno = false;

            var rp = new Entersoft.Data.DotNetResponse.SQL.Persistence { StoredProcedure = "sp_ins_Periodo" };

            using (var objConn = new Persistence(true, ConnDB))
            {
                rp.ClearParametro();

                rp.AddParametro(Llave);
                rp.AddParametro(Glosa);
                rp.AddParametro(Estado.EstadoId);
                rp.AddParametro(-99);
                rp.AddParametro("");

                objConn.ExecuteNonQuery(ref rp);

                if (!rp.TieneErrores)
                {
                    retorno = Convert.ToInt32(rp.Parametro[3]).Equals(0);
                    message = rp.Parametro[4].ToString();

                    if (retorno)
                        objConn.Commit();
                }
                else
                    message = rp.Errores;
            }

            rp.Dispose();

            return retorno;
        }

        public int TomaActual(int BodegaId)
        {
            mMensaje = "";

            return TomaActual(mLlave, BodegaId, ref mMensaje);
        }

        private static int TomaActual(string Llave, int BodegaId, ref string message)
        {
            var retorno = -999;

            var rp = new Entersoft.Data.DotNetResponse.SQL.Persistence();

            using (var objConn = new Persistence(false, ConnDB))
            {
                rp.ClearParametro();

                rp.AddParametro(Llave);
                rp.AddParametro(BodegaId);

                objConn.ExecuteScalar(ref rp, string.Format("SELECT dbo.fn_NroTomaVigente('{0}', {1})", Llave, BodegaId));

                if (!rp.TieneErrores)
                {
                    if (rp.GetScalar != null)
                        retorno = Convert.ToInt32(rp.GetScalar);
                }
                else
                    message = rp.Errores;
            }

            rp.Dispose();

            return retorno;
        }

    }
}
